package com.aco.fatureapp.activity;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import roboguice.inject.ContentView;
import roboguice.inject.InjectView;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import br.com.ac.fatureweb.integration.enums.EnumSincronizacaoTabelas;

import com.aco.fatureapp.R;
import com.aco.fatureapp.enums.EnumProgress;
import com.aco.fatureapp.model.Roteiro;
import com.aco.fatureapp.service.SrvExportRoute;
import com.aco.fatureapp.utilitary.ProgressAsyncTask;
import com.aco.fatureapp.utilitary.ResultAsyncTask;
import com.aco.fatureapp.utilitary.Utils;
import com.google.inject.Inject;

@ContentView(R.layout.activity_export)
public class ExportActivity extends BaseActivity {

	@InjectView(R.id.progressBarTabelas)
	ProgressBar progressBarTabelas;

	@InjectView(R.id.txtPercentualTabelas)
	TextView txtPercentualTabelas;

	@InjectView(R.id.txtQuantidadeTabelas)
	TextView txtQuantidadeTabelas;

	@InjectView(R.id.progressBarRegistros)
	ProgressBar progressBarRegistros;

	@InjectView(R.id.txtPercentualRegistros)
	TextView txtPercentualRegistros;

	@InjectView(R.id.txtQuantidadeRegistros)
	TextView txtQuantidadeRegistros;

	@InjectView(R.id.pnlMensagem)
	LinearLayout pnlMensagem;

	@InjectView(R.id.txtMensagem)
	TextView txtMensagem;

	@InjectView(R.id.txtNomeTabela)
	TextView txtNomeTabela;

	@Inject
	private SrvExportRoute mSrvExportRoute;

	/*
	 * Roteiro que será exportado.
	 */
	private Roteiro mRoteiro;

	/*
	 * Parâmetros de consulta ao webservice.
	 */
	private List<NameValuePair> mParams = null;

	/*
	 * Quantidade de entidades envolvidas na exportação do roteiro.
	 */
	private final int QTD_TABELAS = 7;

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.aco.fatureapp.activity.BaseActivity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		this.mRoteiro = (Roteiro) getIntent().getSerializableExtra(
				Roteiro.getTableName(Roteiro.class));
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
	 */
	@Override
	public boolean onCreateOptionsMenu(final android.view.Menu menu) {
		super.onCreateOptionsMenu(menu);

		final MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.action_bar_menu_export, menu);

		getActionBar().setDisplayHomeAsUpEnabled(true);

		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see android.app.Activity#onMenuItemSelected(int, android.view.MenuItem)
	 */
	@Override
	public boolean onMenuItemSelected(final int featureId, final MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home: {
			finish();
			return true;
		}
		case R.id.menu_export: {
			if (!Utils.isInternetAvailable(this)) {
				Utils.alert(this, "Equipamento sem conexão de internet.", null);
				return true;
			}

			Utils.alert(this, "Tem certeza que deseja descarregar o roteiro?",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							new ExportAsyncTask().execute();
						}
					}, null);

			return true;
		}
		case R.id.menu_cancelar: {
			finish();
			return true;
		}
		}

		return true;
	}

	/**
	 *
	 * Task responsável por todo o processamento da importação do roteiro.
	 *
	 */
	public class ExportAsyncTask extends ProgressAsyncTask {

		@Override
		protected void onPreExecute() {
			progressBarTabelas.setMax(QTD_TABELAS);

			preencherParametrosConsulta();

			super.onPreExecute();
		}

		@Override
		protected ResultAsyncTask doInBackground(final String... parametro) {
			try {
				String msg = mSrvExportRoute.execute(mParams, this, null);
				return new ResultAsyncTask(EnumProgress.SUCCESS, msg);
			}
			catch (final Exception e) {
				return new ResultAsyncTask(EnumProgress.ERRO, e.getMessage());
			}
		}

		@Override
		@SuppressWarnings("incomplete-switch")
		protected void onProgressUpdate(final Integer... values) {
			super.onProgressUpdate(values);

			switch (EnumProgress.getValueOf(values[0])) {
			case INICIO: {
				pnlMensagem.setVisibility(View.VISIBLE);
				break;
			}
			case FIM: {
				pnlMensagem.setVisibility(View.GONE);
				break;
			}
			case EM_ANDAMENTO: {
				final int progressTabelas = values[1];
				final int progressRegistros = values[2];
				final int totalReg = values[3];
				final int tabela = values[4];

				atualizarBarrasDeProgresso(progressTabelas, progressRegistros,
						totalReg, tabela);
				break;
			}
			}
		}

		@Override
		protected void onPostExecute(final ResultAsyncTask result) {

			progressBarRegistros.setProgress(0);
			progressBarTabelas.setProgress(0);

			mSrvExportRoute.closeDB();

			Utils.alert(ExportActivity.this, result.getMessage(),
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(final DialogInterface dialog,
								final int which) {
							finish();
						}
					});

			super.onPostExecute(result);
		}
	}

	/**
	 *
	 * Realiza a interação com o usuário através de barras de progresso e
	 * mensagens.
	 *
	 * @param progressTabelas
	 * @param progressRegistros
	 * @param totalReg
	 * @param tabela
	 */
	private void atualizarBarrasDeProgresso(final int progressTabelas,
			final int progressRegistros, final int totalReg, final int tabela) {

		DecimalFormat df2 = new DecimalFormat("00");
		DecimalFormat df4 = new DecimalFormat("0000");

		if (progressRegistros > -1) {
			if ((progressBarRegistros.getMax() == 0)
					|| (progressTabelas != progressBarTabelas.getProgress())) {
				progressBarRegistros.setMax(totalReg);
			}

			progressBarTabelas.setProgress(progressTabelas);
			progressBarRegistros.setProgress(progressRegistros);

			txtQuantidadeTabelas.setText(df2.format(progressTabelas) + "/"
					+ df2.format(QTD_TABELAS));

			txtQuantidadeRegistros.setText(df4.format(progressRegistros) + "/"
					+ df4.format(totalReg));

			Integer pr = 0, pt = 0;

			if (totalReg > 0) {
				pr = (progressRegistros * 100 / totalReg);
			}

			pt = progressTabelas * 100 / QTD_TABELAS;

			txtPercentualTabelas.setText(String.valueOf(pt) + " %");
			txtPercentualRegistros.setText(String.valueOf(pr) + " %");

			txtNomeTabela.setText(EnumSincronizacaoTabelas.getValueOf(tabela)
					.getDescricao());
		}
	}

	/**
	 * Responsável por buscar e preencher uma lista com os parâmetros
	 * necessários para consumir o serviço de exportação.
	 */
	private void preencherParametrosConsulta() {
		this.mParams = new ArrayList<NameValuePair>();

		mParams.add(new BasicNameValuePair("idRoteiro", mRoteiro
				.getIdIntegracao().toString()));

		mParams.add(new BasicNameValuePair("imei", Utils.getImei(this)));

		mParams.add(new BasicNameValuePair("usuario", usuarioLogado.getCodigo()
				.toString()));

		mParams.add(new BasicNameValuePair("senha", usuarioLogado.getSenha()));
	}
}